gl renderer: Cache rendered fallback nodes
authorTimm Bäder <mail@baedert.org>
Tue, 5 Mar 2019 08:03:11 +0000 (09:03 +0100)
committerTimm Bäder <mail@baedert.org>
Wed, 6 Mar 2019 05:31:25 +0000 (06:31 +0100)
gsk/gl/gskglrenderer.c

index 02b15f5c8e7b3764bf9ca6a52d1bb84992815738..599c7a760ca0c2ff63d6e294399422597987cd1d 100644 (file)
@@ -433,12 +433,23 @@ render_fallback_node (GskGLRenderer       *self,
   const int surface_height = ceilf (node->bounds.size.height) * scale;
   cairo_surface_t *surface;
   cairo_t *cr;
+  int cached_id;
   int texture_id;
 
   if (surface_width <= 0 ||
       surface_height <= 0)
     return;
 
+  cached_id = gsk_gl_driver_get_texture_for_pointer (self->gl_driver, node);
+
+  if (cached_id != 0)
+    {
+      ops_set_program (builder, &self->blit_program);
+      ops_set_texture (builder, cached_id);
+      ops_draw (builder, vertex_data);
+      return;
+    }
+
   surface = cairo_image_surface_create (CAIRO_FORMAT_ARGB32,
                                         surface_width,
                                         surface_height);
@@ -474,6 +485,8 @@ render_fallback_node (GskGLRenderer       *self,
 
   cairo_surface_destroy (surface);
 
+  gsk_gl_driver_set_texture_for_pointer (self->gl_driver, node, texture_id);
+
   ops_set_program (builder, &self->blit_program);
   ops_set_texture (builder, texture_id);
   ops_draw (builder, vertex_data);